package code.class1;

import cn.hutool.core.util.ArrayUtil;

/**
 * https://leetcode.cn/problems/reverse-string-ii/
 * 反转字符串2
 * <p>
 * 给定一个字符串 s 和一个整数 k，从字符串开头算起，每计数至 2k 个字符，就反转这 2k 字符中的前 k 个字符。
 * 如果剩余字符少于 k 个，则将剩余字符全部反转。
 * 如果剩余字符小于 2k 但大于或等于 k 个，则反转前 k 个字符，其余字符保持原样。
 */
public class Code12_ReverseStr2 {

    public static void main(String[] args) {
        String str = "abcdfgh"; // abc def ghi  => cba fed ihg
        int k = 2;
        String ans = reverseStr(str, k);
        System.out.println(ArrayUtil.toString(ans));
    }

    public static String reverseStr(String s, int k) {
        char[] chars = s.toCharArray();

        // start：起始位置
        // end：结尾位置  2*k-1
        // index：交换的位置，起始为 k-1
        int start = 0, end = 2 * k - 1, index = k - 1;

        // 反转字符串
        while (end < chars.length) {
            reverse(chars, start, index);
            start = end + 1;
            end = start + (2 * k) - 1;
            index = start + k - 1;
        }

        int lastNums = chars.length - start;
        // 如果剩余字符少于 k 个，则将剩余字符全部反转。
        if (lastNums < k) {
            reverse(chars, start, chars.length - 1);
        }
        // 如果剩余字符小于 2k 但大于或等于 k 个，则反转前 k 个字符，其余字符保持原样。
        if (lastNums >= k && lastNums < 2 * k) {
            reverse(chars, start, index);
        }

        return new String(chars);
    }

    public static void reverse(char[] chars, int p1, int p2) {
        while (p1 < p2) {
            swap(chars, p1++, p2--);
        }
    }

    public static void swap(char[] arr, int x, int y) {
        char t = arr[x];
        arr[x] = arr[y];
        arr[y] = t;
    }
}
